package org.lanqiao.tjut.test;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import org.lanqiao.tjut.db.DBDriver;
import org.lanqiao.tjut.mapping.UsersEntityMapper;
import org.lanqiao.tjut.orm.UsersEntity;
import org.lanqiao.tjut.orm.UsersEntity2;

public class MybatisTestDriver {
	// 驱动类
	@Test
	public void testMybatis_select_01() {
		// // 1 获取Mybatis的属性配置文件信息
		// // 数据流
		// InputStream is =
		// MybatisTestDriver.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
		// // 2 获取sqlsessionFactory对象
		// SqlSessionFactory sessionFactory = new
		// SqlSessionFactoryBuilder().build(is);

		SqlSessionFactory sessionFactory = DBDriver.getNewInstanceSessionFactory();

		// 3 获取sqlsession对象，进行数据库操作
		SqlSession session = sessionFactory.openSession();
		// 4 打开sqlsession对象，调用映射配置中的sql语句进行数据操作
		// 实例化
		UsersEntity suerE = session.selectOne("org.lanqiao.tjut.mapping.UsersEntityMapper.selectUsersInfo", 1);
		// 5 获取数据库操作结果集，并进行遍历显示
		// 如果搜索不到 suerE为null suerE.toString()会报错
		// LogFactory.useCommonsLogging();
		System.out.println("查询结果：" + suerE.toString());
		// 6 关闭session对象，回收资源
		session.close();
	}

	@Test
	public void testMybatis_select_02() {
		// 1 获取Mybatis的属性配置文件信息
		InputStream is = MybatisTestDriver.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
		// 2 获取sqlsessionFactory对象
		//使用此方法需要在 MybatisTestDriver 中加入：
		//<properties resource="db.properties" />
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
		// 3 获取sqlsession对象，进行数据库操作
		SqlSession session = sessionFactory.openSession();
		// 4 打开sqlsession对象，调用映射配置中的sql语句进行数据操作
		UsersEntity userE0 = new UsersEntity();
		userE0.setUserid(2);
		UsersEntity suerE = session.selectOne("org.lanqiao.tjut.mapping.UsersEntityMapper.selectUsersInfo", userE0);
		// 5 获取数据库操作结果集，并进行遍历显示
		// log4日志
		// 有输出但是会报错？？？？？？？？？？？？？？？？？？？？？？？
		// LogFactory.useCommonsLogging();
		// 会屏蔽System.out
		System.out.println("查询结果：" + suerE.toString());

		// 6 关闭session对象，回收资源
		session.close();
	}

	/**
	 * 使用resultMap映射
	 */
	@Test
	public void testMybatis_select_03() {
		// 1 获取Mybatis的属性配置文件信息
		InputStream is = MybatisTestDriver.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
		// 2 获取sqlsessionFactory对象
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
		// 3 获取sqlsession对象，进行数据库操作
		SqlSession session = sessionFactory.openSession();
		// 4 打开sqlsession对象，调用映射配置中的sql语句进行数据操作

		// 不能使用
		// UsersEntity2 userE0 = new UsersEntity2();
		// userE0.setUser_id(2);
        // 注意所见对象类名
		UsersEntity2 suerE = session.selectOne("org.lanqiao.tjut.mapping.UsersEntityMapper.selectUsersInfo2", 1);
		// 5 获取数据库操作结果集，并进行遍历显示
		System.out.println("查询结果：" + suerE.toString());

		// 6 关闭session对象，回收资源
		session.close();
	}

	
	/**
	 * mapper
	 * 
	 * 通过接口实现传值
	 * 
	 */
	@Test
	public void testMybatis_select_04() {
		// 1 获取Mybatis的属性配置文件信息
		InputStream is = MybatisTestDriver.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
		
		// 2 获取sqlsessionFactory对象
		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
		
		// 3 获取sqlsession对象，进行数据库操作
		SqlSession session = sessionFactory.openSession();
		
		// 4 打开mapper  映射接口对象，调用映射配置中的sql语句进行数据操作
		UsersEntityMapper usersM = session.getMapper(UsersEntityMapper.class);
		UsersEntity suerE = usersM.selectUsersInfo(2);
		
		// 5 获取数据库操作结果集，并进行遍历显示
		System.out.println("查询结果：" + suerE.toString());
		// 6 关闭session对象，回收资源
		session.close();
	}
	
	
	/**
	 * 添加信息
	 */
	@Test
	public void testMybatis_insert_01() {
		// 1 获取Mybatis的属性配置文件信息
		// 数据流

		// 2 获取sqlsessionFactory对象
		SqlSessionFactory sessionFactory = DBDriver.getNewInstanceSessionFactory();
		// 打开的session默认是事物开启状态

		// 3 获取sqlsession对象，进行数据库操作
		SqlSession session = sessionFactory.openSession();
		// 4 打开sqlsession对象，调用映射配置中的sql语句进行数据操作

		// 创建一个新的实体对象数据
		UsersEntity userP = new UsersEntity();
		userP.setUsername("小李");
		userP.setUserage(20);
		userP.setUseraddress("天津和平");
		// 使用insert方法
		int i = session.insert("org.lanqiao.tjut.mapping.UsersEntityMapper.saveUsersInfo", userP);
		// 5 获取数据库操作结果集，并进行遍历显示
		// 如果搜索不到 suerE为null suerE.toString()会报错
		// 添加成功i=1

		System.out.println("新增结果：" + i);

		// 提交事务
		session.commit();
		// 会显示但是报错 且数据不会添加到数据库中？？？？？？？？？？？？？？？？？？？？？？？
		// 要放到 提交事物外面
		// LogFactory.useCommonsLogging();
		// 6 关闭session对象，回收资源
		session.close();
	}
}
